﻿#include <iostream>

using namespace std;

//class person
//{
//public:
//	virtual void func() {
//		cout << "person" << endl;
//	}
//};
//
//class student : public person
//{
//public:
//	virtual void func()
//	{
//		cout << "student" << endl;
//	}
//};
//
//void funcs(person& s1)//完成了虚函数重写
//{
//	s1.func();
//}

//class A
//{
//public:
//	virtual void func(int val = 1)
//	{
//		std::cout << "A->" << val << std::endl;
//	}
//	virtual void test()//隐藏了A*this
//	{
//		func();
//	}
//};
//
//class B : public A
//{
//public:
//	void func(int val = 0)
//	{
//		cout << "B->" << val << std::endl;
//	}
//
//	//virtual void test()
//	//{
//	//	func();
//	//}
//};
//int main(int argc, char* argv[])
//{
//	B* p = new B;
//	p->test();
//	p->func();
//	return 0;
//}

//class A {
//public:
//	virtual void func(int val = 1)
//	{
//		std::cout << "A->" << val << std::endl;
//	}
//	virtual void test()//隐藏了A*this
//	{
//		func(); //  此处通过基类A的this指针调用虚函数func()
//	}
//};
//
//class B : public A {
//public:
//	void func(int val = 0)
//	{
//		cout << "B->" << val << std::endl;
//	}
//	//类B继承自类A，自动获得父类的 test() 方法
//	//即使B类没有重写 test()，仍可通过子类对象调用继承自父类的方法
//};
//
//int main() {
//	B* p = new B;
//	p->test(); // 调用继承自A的test()
//	p->func(); // 直接调用B的func()
//	delete p;
//	return 0;
//}


//class A
//{
//public:
//	virtual A* func()
//	{
//		cout << "AAAAAAAA" << endl;
//		return this;
//	}
//};
//
//class B : public A
//{
//	virtual B* func()
//	{
//		cout << "BBBBBBBB" << endl;
//		return this;
//	}
//};


//class A{
//public:
//	virtual ~A(){
//		cout << "AAAAAAAA" << endl;
//	}
//};
//class B : public A{
//	~B(){
//		cout << "BBBBBBBB" << endl;
//	}
//};
//int main(){
//	A* p1 = new A;
//	A* p2 = new B;
//	delete p1;//只调用A的析构函数
//	delete p2;//调用B的析构函数后调用A的析构函数
//	return 0;
//}

//class person
//{
//public:
//	virtual void func() final 
//	{
//		//
//	}
//};

//class person
//{
//public:
//	virtual void func()
//	{
//		//
//	}
//};
//class student
//{
//public:
//	virtual void func() override
//	{
//		//
//	}
//};


class person{
public:
	virtual void func() = 0;
};

class student : public person{
public:
	virtual void func()//必须对纯虚函数进行重写
	{
		cout << "i am a student" << endl;
	}
};
int main()
{
	student s1;
	s1.func();
}